home *** CD-ROM | disk | FTP | other *** search
/ PCMania 30 / PCMania CD30.iso / pcmania / c30 / inverx.c next >
C/C++ Source or Header  |  1995-02-22  |  5KB  |  195 lines

  1. #include <stdio.h> 
  2.  
  3. struct cabecera{
  4. char indicador;             /* constante. Si=10 es un archivo PCX */
  5. char version;               /* version pcx */
  6. char codificacion;          /* Si=1 el PCX esta comprimido */
  7. char bits_pixel;            /* bits por pixel (1,2,4,8) */
  8. unsigned int Xmin;          
  9.         /* los 4 campos que siguen dan el recuadrado de la imagen */
  10. unsigned int Ymin;
  11. unsigned int Xmax;
  12. unsigned int Ymax;
  13. unsigned int Hres;
  14. unsigned int Vres;
  15. char paleta_16[48];         /* si la pcx tiene <=16 colores, aqui paleta */
  16. char reserv1;               /* reservado */
  17. char nplanos;               /* num. de planos usados en la imagen */
  18. unsigned int bytes_linea;   /* bytes necesarios para decodificar una linea */
  19. unsigned int infopal;       /* Si=1 color o blanco y negro. 0=grises */
  20. unsigned int anchura;       /* anchura de la imagen */
  21. unsigned int altura;        /* altura de la imagen */
  22. char sobrante[54];          /* sobrante de cabecera para futuras ampliaciones */
  23. unsigned char datos[32767];
  24. };
  25. struct cabecera buffer;     /* estructura para la cabecera de f. pcx */
  26.  
  27. unsigned char string[50];   /* cadenas para el nombre */
  28. unsigned char mam[30];
  29.  
  30. main()
  31. {
  32. unsigned char tecla;
  33.  
  34. principio:
  35.  
  36. scr_setmode(3);
  37. exec("\\command.com", "/cdir /w *.pcx");
  38. printf("indica la pantalla a tratar ");
  39. scanf("%s",mam);
  40. scr_setmode(19);        /* pone el modo grafico de 320*200 con 256 colores */
  41. /* scr_clr();            esta funcion borra la pantalla y coloca el cursor
  42. en la esquina superior izquierda. No es una funcion estandard de C, sino propia
  43. del PCC y su nombre varia en otros compiladores */
  44. strcpy(string,mam);
  45. strcat(string,".pcx");
  46. loadPCX();
  47. scr_ci();
  48. scr_setmode(3);
  49. puts("¿Deseo invertirla S/N? ");
  50. tecla=scr_ci();
  51. if (tecla!='s' && tecla!='S')
  52.  {
  53.  puts("\n¿Deseo visualizar otra pantalla S/N? ");
  54.  tecla=scr_ci();
  55.  if (tecla=='s' || tecla=='S')
  56.   goto principio;
  57.  exit(0);
  58.  }
  59. else
  60. scr_setmode(19); 
  61. loadPCX();
  62. inversionX();
  63. scr_ci();
  64. goto principio;
  65. }
  66.  
  67.  
  68. loadPCX()
  69. {
  70.  
  71. unsigned int pos,posp,pal;
  72. unsigned char con;
  73. unsigned contx,conty;       /* contadores de filas y columnas */
  74. FILE *fichero;
  75. unsigned pantalla;          /* guarda el segmento a la pantalla */
  76. unsigned char *paleta;      /* puntero a la paleta */
  77.  
  78. pantalla=40960;             /* segmento de pantalla */
  79. /* esta rutina solo visualiza bien las pcx a 320*200 */
  80.  
  81. if ((fichero=fopen(string,"rb"))==0)
  82.  {
  83.  printf("\n Error: El fichero no puede abrirse!\n\n");
  84.  exit(1);
  85.  }
  86.  fread(&buffer,32767,1,fichero); 
  87.  pos=0;             /* inicializar indice para buffer.datos[] */
  88.  posp=0;            /* inicializar posicion para pantalla */
  89.  if (buffer.Ymax-buffer.Ymin>200 || buffer.Xmax-buffer.Xmin>320)
  90.   {
  91.   puts("\nEsta pcx excede al tamaño tratable");
  92.   exit(1);
  93.   }
  94.  for(conty=0;conty<(buffer.Ymax-buffer.Ymin)+1;conty++)
  95.   for(contx=0;contx<(buffer.Xmax-buffer.Xmin)+1;)
  96.   {
  97.   if (pos==32639)
  98.    {
  99.    fread(&buffer+128,32000,1,fichero); 
  100.    pos=0;
  101.    }
  102.   if ((buffer.datos[pos]&192)==192) 
  103. /* codificacion RLE: el byte que sigue ha de ser repetido */
  104.    {
  105.    con=buffer.datos[pos]&63;    /* numero de repeticiones para el byte */
  106.    if (pos+1<32639)
  107.     {
  108.     while(con!=0)
  109.      {
  110.      _poke(buffer.datos[pos+1],posp,pantalla);
  111.      posp++;
  112.      contx++;
  113.      con--;
  114.      }
  115.     pos+=2;
  116.     }
  117.    else
  118.     {
  119.     fread(&buffer+128,32000,1,fichero); 
  120.     pos=0;
  121.     while(con!=0)
  122.      {
  123.      _poke(buffer.datos[pos],posp,pantalla);
  124.      posp++;
  125.      contx++;
  126.      con--;
  127.      }
  128.     pos++;
  129.     }
  130.    }
  131.   else
  132.    {                /* tratamiento para pixel no repetido */
  133.    _poke(buffer.datos[pos],posp,pantalla);
  134.    posp++;
  135.    contx++;
  136.    pos++;
  137.    }
  138.   }
  139. /* la paleta se encuentra en los ultimos 768 bytes del f. 
  140.    antes que nada hay que desplazar los 768 bytes 2 pos. a la der. */
  141.  pos++;
  142.  paleta=&buffer.datos[pos];
  143.  for (pal=0;pal<768;pal++)
  144.   buffer.datos[pos+pal]/=4;
  145.  prepal(paleta);
  146. }
  147.  
  148.  
  149.  
  150. inversionX()
  151. {
  152. unsigned a,b,c,d,pantalla;
  153. unsigned char swap1,swap2;
  154.  
  155. pantalla=40960;
  156. for (a=0;a<200;a++)
  157.  for (b=0,c=319;b<160;b++,c--)
  158.   {
  159.   swap1=_peek((a*320)+b,pantalla);  
  160.   swap2=_peek((a*320)+c,pantalla);  
  161.   _poke(swap2,(a*320)+b,pantalla);
  162.   _poke(swap1,(a*320)+c,pantalla);
  163.   }
  164. }
  165.  
  166.  
  167.  
  168. prepal(paleta)
  169. {
  170. unsigned char *paleta;
  171.  
  172. #asm
  173.     MOV DX,[BP+4]   ;paleta
  174.     PUSH BP
  175.     PUSH DS
  176.     PUSH ES
  177.     PUSH SI
  178.     PUSH DI
  179.     MOV  AX,DS
  180.     MOV     ES,AX
  181.     MOV  AX,1012h
  182.     mov  BX,0
  183.     mov  CX,256
  184.     INT  10h
  185.     POP  DI
  186.     POP  SI
  187.     POP  ES
  188.     POP  DS
  189.     POP  BP
  190. #
  191.  
  192.  
  193.  
  194.